package com.hua.util;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;

import com.jeremyliao.liveeventbus.LiveEventBus;

import org.greenrobot.eventbus.EventBus;

/**
 * 类名：CommEventBusUtil
 * 创建人：蒋剑华
 * 创建时间：2025/11/7 14:03
 * 类描述：EventBus通信，解耦项目用的
 */
public class CommLiveEventBusUtil {

    private static volatile CommLiveEventBusUtil commEventBusUtil = null;

    private CommLiveEventBusUtil() {

    }

    public static CommLiveEventBusUtil getInstance() {
        if (commEventBusUtil == null) {
            synchronized (CommLiveEventBusUtil.class) {
                if (commEventBusUtil == null) {
                    commEventBusUtil = new CommLiveEventBusUtil();
                }
            }
        }
        return commEventBusUtil;
    }


    /**
     * 注册 EventBus（避免重复注册）
     * @param subscriber 订阅者（如 Activity、Fragment、ViewModel）
     */
    public void register(@NonNull Object subscriber) {
        if (subscriber == null) {
            throw new IllegalArgumentException("订阅者（subscriber）不能为 null！");
        }
        // 未注册时才注册，避免重复注册导致订阅方法多次执行
        if (!EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().register(subscriber);
        }
    }

    /**
     * 解绑 EventBus（避免未注册时解绑抛出异常）
     * @param subscriber 订阅者
     */
    public void unregister(@NonNull Object subscriber) {
        if (subscriber == null) {
            throw new IllegalArgumentException("订阅者（subscriber）不能为 null！");
        }
        // 已注册时才解绑，避免未注册时调用 unregister 抛出异常
        if (EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().unregister(subscriber);
        }
    }

    /**
     * 发送普通事件（先注册，后发送才能接收）
     * @param event 事件对象（任意 Java Bean）
     */
    public void postEvent(@NonNull Object event) {
        if (event == null) {
            throw new IllegalArgumentException("事件（event）不能为 null！");
        }
        EventBus.getDefault().post(event);
    }


    /**
     * 方法名：postStickyEvent
     * 作者：蒋剑华
     * 创建时间：2025/11/7 15:31
     * 参数描述：@param event 事件对象（任意 Java Bean）
     * 方法描述：发送一个粘性事件
     * 返回类型：
     */
    public void postStickyEvent(@NonNull Object event) {
        if (event == null) {
            throw new IllegalArgumentException("粘性事件（event）不能为 null！");
        }
        EventBus.getDefault().postSticky(event);
    }

    /**
     * 方法名：removeStickyEvent
     * 作者：蒋剑华
     * 创建时间：2025/11/7 15:34
     * 参数描述：@param eventClass 粘性事件类（如 MessageEvent.class）
     * 方法描述：移除指定类型的粘性事件
     * 返回类型：被移除的粘性事件对象（可能为 null，表示没有该类型的粘性事件）
     */
    public <T> T removeStickyEvent(@NonNull Class<T> eventClass) {
        if (eventClass == null) {
            throw new IllegalArgumentException("事件类（eventClass）不能为 null！");
        }
        return EventBus.getDefault().removeStickyEvent(eventClass);
    }


    /**
     * 方法名：removeAllStickyEvents
     * 作者：蒋剑华
     * 创建时间：2025/11/7 15:36
     * 参数描述：
     * 方法描述：移除所有粘性事件（谨慎使用！）
     * 返回类型：void 无返回类型
     */
    public void removeAllStickyEvents() {
        EventBus.getDefault().removeAllStickyEvents();
    }

    /**
     * 方法名：isRegistered
     * 作者：蒋剑华
     * 创建时间：2025/11/7 15:38
     * 参数描述：
     * @param subscriber 订阅者
     * 方法描述：判断订阅者是否已注册 EventBus
     * 返回类型：true：已注册；false：未注册
     */
    public boolean isRegistered(@NonNull Object subscriber) {
        if (subscriber == null) {
            throw new IllegalArgumentException("订阅者（subscriber）不能为 null！");
        }
        return EventBus.getDefault().isRegistered(subscriber);
    }

    /**
     * 方法名：cancelEventDelivery
     * 作者：蒋剑华
     * 创建时间：2025/11/7 15:41
     * 参数描述：
     * @param event 要取消传递的事件对象
     * 方法描述：取消事件传递（仅在 ThreadMode.POSTING 模式下有效）
     * 返回类型：void 无返回值
     */
    public void cancelEventDelivery(@NonNull Object event) {
        if (event == null) {
            throw new IllegalArgumentException("事件（event）不能为 null！");
        }
        EventBus.getDefault().cancelEventDelivery(event);
    }


}
